package com.zkh.myutils.net.smtp;

import java.io.IOException;

import com.zkh.myutils.io.log.Logger;
import com.zkh.myutils.net.SocketClient;
import com.zkh.myutils.net.SocketLogListener;
import com.zkh.myutils.net.utils.Reply;

/**
 * Smtp客户端
 */
public class SMTP extends SocketClient {
	//默认端口
	public static final int DEFAULT_PORT = 25;
	
	{
		//初始化监听器
		initCommandEventListenerHandler(this);
		//如果是调试模式，添加数据传输监听器
		if(Logger.isDebug()) {
			getTransferEventListenerHandler().addTransferEventListener(new SocketLogListener());
		}
	}
	
	/**
	 * 创建连接
	 */
	@Override
	protected void connect() throws IOException{
		//连接之后，需要获取一个响应代码
		getReply();
	}
	
	/**
	 * 发送HELO命令建立连接
	 * @param hostname 用户名
	 */
	public boolean hello(String hostname) throws IOException{
		return Reply.isPositiveCompletion(sendCommand(SMTPCmd.HELO, hostname));
	}
	
	/**
	 * 发送HELO命令建立连接
	 */
	public boolean hello() throws IOException{
		//获取本地主机
		String hostname = getLocalAddress().getHostName();
		//为空直接返回
		if (hostname == null) {
			return false;
		}
		return hello(hostname);
	}
	
	/**
	 * 设置发送者
	 * @param address 发送者地址
	 */
	public boolean setSender(String address) throws IOException{
		return Reply.isPositiveCompletion(sendCommand(SMTPCmd.MAIL, "<" + address + ">"));
	}
	
	/**
	 * 添加收件人
	 * @param address 接收人地址
	 */
	public boolean addRecipient(String address) throws IOException{
		return Reply.isPositiveCompletion(sendCommand(SMTPCmd.RCPT, "<" + address + ">"));
	}
	
	/**
	 * 发送DATA命令，开启传输数据传话
	 */
	public boolean sendData() throws IOException {
		return Reply.isPositiveIntermediate(sendCommand(SMTPCmd.DATA));
	}
	
	/**
	 * 追加数据，自动添加换行符\r\n（在发送DATA命令后传输数据）
	 * @param data 发送的数据
	 */
	public void appendData(String data) throws IOException {
		appendData(data, true);
	}
	
	/**
	 * 追加数据（在发送DATA命令后传输数据）
	 * @param data 发送的数据
	 * @param addLineEnd 是否追加行结束标识\r\n
	 * @throws IOException
	 */
	public void appendData(String data, boolean addLineEnd) throws IOException {
		//写数据
		writer.write(data);
		//追加行结束标识\r\n
		if(addLineEnd) {
			writer.write("\r\n");
		}
		//刷新
		writer.flush();
	}
	
	/**
	 * 登出
	 */
	public boolean logout() throws IOException{
		return Reply.isPositiveCompletion(sendCommand(SMTPCmd.QUIT));
	}
	
	/**
	 * 重置
	 */
	public boolean reset() throws IOException{
		return Reply.isPositiveCompletion(sendCommand(SMTPCmd.RSET));
	}
	
	/**
	 * 验证用户名
	 * @param username 用户名
	 */
	public boolean verify(String username) throws IOException{
		//执行验证
		int result = sendCommand(SMTPCmd.VRFY);
		//返回
		return result==SMTPReply.ACTION_OK || result==SMTPReply.USER_NOT_LOCAL_WILL_FORWARD;
	}
	
	/**
	 * 权限验证
	 * @param username 帐号
	 * @param password 密码
	 * @return
	 */
	public boolean authLogin(String username, String password) throws IOException {
		//权限命令
		if(!Reply.isPositiveIntermediate(sendCommand(SMTPCmd.AUTH))) {
			return false;
		}
		//帐号
		writer.write(username+"\r\n");writer.flush();
		//查看响应
		if(!Reply.isPositiveIntermediate(getReply())) {
			return false;
		}
		//密码
		writer.write(password+"\r\n");writer.flush();
		//检查响应
		return Reply.isPositiveCompletion(getReply());
	}

	/**
	 * 列举帮助文档
	 */
	public String listHelp() throws IOException{
		if(Reply.isPositiveCompletion(sendCommand(SMTPCmd.HELP))) {
			return getReplyString();
		}
		return null;
	}

	/**
	 * 查询命令帮助文档
	 */
	public String listHelp(String command) throws IOException{
		if(Reply.isPositiveCompletion(sendCommand(SMTPCmd.HELP, command))) {
			return getReplyString();
		}
		return null;
	}

	/**
	 * 发送无操作命令
	 */
	public boolean sendNoOp() throws IOException{
		return Reply.isPositiveCompletion(sendCommand(SMTPCmd.NOOP));
	}

}
